/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.AnalisadorSintatico;


import compilador.AnalisadorLexico.Atomo;
import compilador.AnalisadorSemantico.GeracaoDeCodigo.TiposAS;

/**
 *
 * @author Leles
 */
public class SM_Program extends SubMaquina {

    private enum Estados {
        ESPERA_PROGRAM, 
        ESPERA_DECLARE_OU_BEGIN, 
        ESPERA_LISTADECLARACAO, ESPERA_BEGIN,
        ESPERA_LISTACMD,
        ESPERA_END, ESPERA_PROGRAM_FIM,
        ESPERA_FUNCOES_OU_FIMARQUIVO, 
        ACEITA
    };

    public SM_Program()  {
        estadoInicial = SM_Program.Estados.ESPERA_PROGRAM.ordinal();
        estadoFinal = Estados.ACEITA.ordinal();
        
        defineTabelaTransicao();
        
    }
    
    
    private void defineTabelaTransicao (){
        /* Tabela com as Transicao
         * A maior parte das posicoes de memoria sao vazias
         * Funciona assim:  o primeiro indice indica o ESTADO ATUAL
         *                  o segundo  indice indica o ATOMO LIDO
         * Transicao DE SUBMAQUINA:
         * também passam um estado, o estado da volta
         * Ele é chamado na funcao, depois do retorno da submaquina
         * assim não é necessaria uma pilha explicita
         */
        
        numEstados = Estados.class.getEnumConstants().length;
        numAtomos = Atomo.TokenType.class.getEnumConstants().length;
        
        Tabela_Decisao = new Transicao [numEstados][numAtomos];
        
        // Transicao SUB MAQUINA PROGRAMA
        // Estado PROGRAM
        Tabela_Decisao 
                [Estados.ESPERA_PROGRAM.ordinal()]
                [Atomo.TokenType.PROGRAM.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_DECLARE_OU_BEGIN.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        // Estado DECLARE_BEGIN
        Tabela_Decisao 
                [Estados.ESPERA_DECLARE_OU_BEGIN.ordinal()]
                [Atomo.TokenType.DECLARE.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_LISTADECLARACAO.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.ESPERA_DECLARE_OU_BEGIN.ordinal()]
                [Atomo.TokenType.BEGIN.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_LISTACMD.ordinal(), 
                                null,
                                TiposAS.INICIO_PROGRAMA);
        // Estado ESPERA LISTA DE DECLARACOES
        Tabela_Decisao 
                [Estados.ESPERA_LISTADECLARACAO.ordinal()]
                [Atomo.TokenType.TRANSICAO_VAZIA.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.ESPERA_BEGIN.ordinal(), 
                                SM_Comandos.class,
                                TiposAS.ACAO_NENHUMA);
        // Estado ESPERA LISTA DE DECLARACOES
        Tabela_Decisao 
                [Estados.ESPERA_BEGIN.ordinal()]
                [Atomo.TokenType.BEGIN.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_LISTACMD.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        // Estado ESPERA LISTA DE COMANDOS
        Tabela_Decisao 
                [Estados.ESPERA_LISTACMD.ordinal()]
                [Atomo.TokenType.TRANSICAO_VAZIA.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.ESPERA_END.ordinal(), 
                                SM_Comandos.class,
                                TiposAS.ACAO_NENHUMA);
        // Estado COMANDOS_END
        Tabela_Decisao 
                [Estados.ESPERA_END.ordinal()][Atomo.TokenType.END.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_PROGRAM_FIM.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        /* ******************************************************************
         * COLOCAR A ZONA TODA AQUI
         * idéia: criar um TokenType 'default' pra pegar todo o resto
         *        jogar todo o resto na submaquina seguinte e tratar o pepino la
        // ******************************************************************/
        
        // Estado ENDPROGRAM
        Tabela_Decisao 
                [Estados.ESPERA_PROGRAM_FIM.ordinal()]
                [Atomo.TokenType.PROGRAM.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_FUNCOES_OU_FIMARQUIVO.ordinal(), 
                                null,
                                TiposAS.FIM_PROGRAMA);
        // Estado FUNCOES_FIMARQUIVO
        Tabela_Decisao 
                [Estados.ESPERA_FUNCOES_OU_FIMARQUIVO.ordinal()]
                [Atomo.TokenType.FIM_ARQUIVO.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ACEITA.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.ESPERA_FUNCOES_OU_FIMARQUIVO.ordinal()]
                [Atomo.TokenType.FUNCTION.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.ESPERA_FUNCOES_OU_FIMARQUIVO.ordinal(), 
                                SM_Function.class,
                                TiposAS.ACAO_NENHUMA);
        
        
    }        

    
    
}
